"""
История команд, их повторный вызов, а так же самые частые команды.

Author: Milinuri Nirvalen
Ver: 2.1.1 (8)
"""

from chiori import Config
from chiori import Plugin

p = Plugin(name='утилиты для команд',
	desc='история команд, их повтор и самые популярные команды')
path = 'data/commands.toml'


# handlers
# ========

@p.eventHandler('before')
async def _(event, ctx):
	c = Config(None, {'reset_time':0}, path)
	uid = str(event.get('from.id'))

	if event.get('level') and ctx.cmd and ctx.cmd not in p.triggers:
		if not uid in c.file_data:
			c.file_data[uid] = {'h': ['~' for x in range(10)]}

		if event.get('text') != c.file_data[uid]['h'][9]:
			c.file_data[uid]['h'].pop(0)
			c.file_data[uid]['h'].append(event.get('text'))

		if ctx.handler['id'] in c.file_data[uid]:
			c.file_data[uid][ctx.handler['id']] += 1
		else:
			c.file_data[uid][ctx.handler['id']] = 1


		if ctx.now > c.file_data["reset_time"]:
			for k, v in list(c.file_data.items()):
				if k == 'reset_time':
					continue

				for n, i in list(v.items()):
					if n == 'h':
						continue

					if i-1 > 0:
						c.file_data[k][n] -= 1
					else:
						del c.file_data[k][n]

				if not len(v):
					del c.file_data[k]

			c.file_data["reset_time"] = ctx.minutes + 86400

		c.save()

# commands
# ========

@p.command('history', 'история', 'ch', usage='история последних 10 команд')
async def commandHistory(event, ctx):
	c = Config(None, {}, path)
	uid = str(event.get('from.id'))

	if uid in c.file_data:
		text = 'история команд:'
		for x in c.file_data[uid]['h']:
			text += f'\n-- {x}'
		await ctx.message(text)


@p.command('replay', 'rcmd', 'rlc', usage='выполнить последнию команду')
async def replayLastCommand(event, ctx):
	c = Config(None, {}, path)
	uid = str(event.get('from.id'))

	if not uid in c.file_data:
		c.file_data[uid]['h'] = ['~' for x in range(10)]
		c.save()

	if ctx.sargs.isdigit() and int(ctx.sargs) in range(10):
		i = int(ctx.sargs)
	else:
		i = 1

	t = event
	t.set('text', f'/{c.file_data[uid]["h"][10-i]}')
	await ctx.app.messageEvent(t, True)


@p.command('lastcmd', 'lcmd', 'lc', 'plc', usage='последняя команда')
async def lastUserCommand(event, ctx):
	c = Config(None, {}, path)
	await ctx.message(f'/{c.file_data[str(event.get("from.id"))]["h"][9]}')


# статистика команд
# =================

@p.command('<t(op) command(s)>', 'топ-команд',
	usage='ваши самые популярные команды')
async def topUserCommands(event, ctx):
	c = Config(filepath=path).file_data
	uid = str(event.get('from.id'))
	text = 'ваши любимые команды:'

	if uid in c:
		i = 0
		del c[uid]['h']
		for k, v in sorted(c[uid].items(), key=lambda x: x[1], reverse=True):
			if k == 'h':
				continue

			i += 1
			text += f'\n-- [{v}] {k}'

			if i > 14:
				break
	else:
		text += f'\n-- вы не использовали команд'

	await ctx.message(text)


@p.command('top-chio-commands', 'tcc', usage='самые популярные команды Чио')
async def topChioCommands(event, ctx):
	c = Config(filepath=path).file_data
	index = {}
	text = 'любимые команды пользователей:'

	for _, u in c.items():
		if isinstance(u, int):
			continue

		i = 0
		del u['h']
		for k, v in sorted(u.items(), key=lambda x: x[1], reverse=True):
			if v == 'h':
				continue

			i += 1
			if k in index:
				index[k] += v
			else:
				index[k] = v

			if i > 14:
				break

	i = 0
	for k, v in sorted(index.items(), key=lambda x: x[1], reverse=True):
		if v > 1:
			i += 1
			text += f'\n-- [{v}] {k}'

		if i > 24:
			break

	await ctx.message(text)


@p.command('<r(eset) tc>', usage='сбросить статистику команд')
async def resetTopCommands(event, ctx):
	c = Config(None, {'reset_time':0}, path)
	uid = str(event.get('from.id'))

	if uid in c.file_data:
		c.file_data[uid] = {"h": c.file_data[uid]['h']}
		c.save()
		await ctx.message('статистика команд была сброшена')
	else:
		await ctx.message('похоже вы ещё не пользовались чио')
